//struct CalcData { float R; float Rc; float Ts; float Te; Int32 N; Int32 P; } ClData[20];

    publicvoid PipeCalcMain2( PaintEventArgs^ e )
            {
                Int32 ClMax, ClCnt, ClCnt1;
                Int32 i, j, n, dan;
                Int32 N1;
                float D1;
                float X, Y, R, R1, R2, R3, R4;
                float X0, Y0, X1, Y1;
                float Th, Th1, Th2, Th3, Th4, Th5, Th6, Th7;
                float Pai, Pai2;
                ClMax = 0; ClCnt = 0; ClCnt1 = 0;
                for ( i = 0; i < 20; i++ )
                        { ClData[i].R = 0; ClData[i].Rc = 0; ClData[i].Ts = 0; ClData[i].Te = 0; ClData[i].N = 0; ClData[i].P = -1; }
                ClData[0].N = 0;
                Pai = 4.0F * atan(1.0F); Pai2 = Pai + Pai;
                Th = 0.0; Th1 = 0.0; Th2 = 0.0; Th3 = 0.0; Th4 = 0.0; Th5 = 0.0; Th6 = 0.0; Th7 = 0.0;
                D1 = 0.0;
                X0 = 150.0; Y0 = 100.0; X1 = X0; Y1 = Y0;
                R1 = 0.0; R2 = 0.0; R3 = 0.0; R4 = 0.0;
                n = 1; dan = 0;
                for ( i = 0; i < DataMax; i++ )
                {
                    //if ( i == 1 ) System::Diagnostics::Debugger::Break();
                    D1 = InData[i].D;
                    N1 = InData[i].N;
                    R = D1 * 0.5F;
                    if ( dan > 0 && ( InData[0].N != 1 || i != 1 ) )
                    {
                        ClCnt1 = ClData[ClCnt].P; if ( ClCnt1 < 0 ) ClCnt1 = 0;
                        R2 = ClData[ClCnt1].R; R3 = ClData[ClCnt1].Rc; R4 = R3 + 2 * R2;
                        Th3 = ClData[ClCnt1].Ts;
                        Th4 = 2 * asin( 0.5F * R2 / ( R3 + R2 ) );
                        Th5 = 2 * asin( 0.5F * R / ( R4 + R ) );
                        //Th5 = 2 * asin( 0.5F * R / ( R3 + R ) );
                        Th6 = 2 * asin( 0.5F * R / ( R1 + D1 + R ) );
                        Th7 = Th3 - Th4 - Th5; if ( Th7 < 0 ) Th7 = Pai2 + Th7;
                        if ( ( Th2 + 2 * Th ) < Th7 )
                        {
                            ClMax += 1;
                            ClData[ClMax].R  = R; 
                            ClData[ClMax].Rc = R1;
                            ClData[ClMax].Ts = Th1 - Th + Th6;
                            ClData[ClMax].N  = 0;
                            ClData[ClMax].P  = ClData[ClCnt].P;
                            ClData[ClCnt].P  = ClMax;
                            ClCnt = ClMax;
                        }
                        else
                        {
                            ClCnt = ClData[ClCnt].P;
                            if ( ClCnt < 0 ) ClCnt = 0;
                        }
                    }
                    if ( n == 1 ) { R1 = R; n = 2; }
                    if ( InData[0].N == 1 && dan == 1 ) R1 = R1; else R1 = ClData[ClCnt].Rc;
                    Th1 = ClData[ClCnt].Ts;
                    for ( j = 1; j <= N1; j++ )
                    {
                        if ( i == 0 && j == 1 )
                        {
                            X = X0;
                            Y = Y0;
                            R1 = R;
                            ClData[ClCnt].R = R; ClData[ClCnt].Rc = R; ClData[ClCnt].Ts = Th1;
                            ClData[ClCnt].N = 1; ClData[ClCnt].P = -1; ClMax = ClCnt;
                            dan += 1;
                            CircleDraw1( X, Y , R, e );
                        }
                        else
                        {
                            X1 = ( R1 + R ) * cos( Th1 );
                            Y1 = ( R1 + R ) * sin( Th1 );
                            if ( ClData[ClCnt].Rc != R1 ) ClData[ClCnt].Rc = R1;
                            if ( ClData[ClCnt].R  != R  ) ClData[ClCnt].R  = R;
                            X = X1 + X0;
                            Y = Y1 + Y0;
                            CircleDraw1( X, Y , R, e );
                            ClData[ClCnt].N += 1;
                            Th = 2 * asin( 0.5F * R / ( R1 + R ) );
                            Th2 = Th1;
                            Th1 += 2 * Th;
                            //if ( i == 1 && j == 44 ) System::Diagnostics::Debugger::Break();
                            ClCnt1 = ClData[ClCnt].P; if ( ClCnt1 < 0 ) ClCnt1 = 0;
                            R2 = ClData[ClCnt1].R; R3 = ClData[ClCnt1].Rc; R4 = R3 + 2 * R2;
                            Th3 = ClData[ClCnt1].Ts;
                            Th4 = 2 * asin( 0.5F * R2 / ( R3 + R2 ) );
                            Th5 = 2 * asin( 0.5F * R / ( R4 + R ) );
                            Th6 = 2 * asin( 0.5F * R / ( R1 + D1 + R ) );
                            Th7 = Th3 - Th4 - Th5; if ( Th7 < 0 ) Th7 = Pai2 + Th7;
                            if ( ( Th2 + 2 * Th ) > Th7 )
                            {
                                if ( ( R1 + 2 * D1 ) <= ( R3 + 2 * R2 ) )
                                {
                                    R1 += D1;
                                    ClData[ClCnt].R = R; ClData[ClCnt].Rc = R1; ClData[ClCnt].N = 0;
                                    Th3 = 2 * asin( 0.5F * R / ( R1 + R ) );
                                    Th1 = ClData[ClCnt].Ts - Th + Th3;
                                    ClData[ClCnt].Ts = Th1;
                                }
                                else
                                {
                                    dan += 1;
                                    ClCnt = ClData[ClCnt].P; if ( ClCnt < 0 ) ClCnt = 0;
                                    R1 = ClData[ClCnt].Rc + 2 * ClData[ClCnt].R;
                                    Th1 = ClData[ClCnt].Ts;
                                }
                            }
                        }
                    }
                }
            }